package com.mini.grpc.spring.annotation;

import java.lang.annotation.*;

/**
 * 标记gRPC客户端的注解
 * 被此注解标记的字段将自动注入gRPC客户端存根
 * 
 * @author Mini-gRPC
 */
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface GrpcClient {
    
    /**
     * 客户端名称，用于标识不同的客户端配置
     * 如果不指定则使用字段类型作为默认名称
     * 
     * @return 客户端名称
     */
    String value() default "";
    
    /**
     * 服务器地址
     * 格式：host:port 或 dns:///service-name
     * 
     * @return 服务器地址
     */
    String address() default "";
    
    /**
     * 是否启用此客户端
     * 
     * @return 是否启用
     */
    boolean enabled() default true;
    
    /**
     * 客户端拦截器类列表
     * 这些拦截器将应用于此客户端的所有调用
     * 
     * @return 拦截器类数组
     */
    Class<?>[] interceptors() default {};
    
    /**
     * 负载均衡策略
     * 支持：round_robin, pick_first
     * 
     * @return 负载均衡策略
     */
    String loadBalancingPolicy() default "round_robin";
    
    /**
     * 连接超时时间（毫秒）
     * 
     * @return 连接超时时间
     */
    long connectTimeoutMillis() default 30000;
    
    /**
     * 调用超时时间（毫秒）
     * 
     * @return 调用超时时间
     */
    long callTimeoutMillis() default 60000;
    
    /**
     * 是否启用重试
     * 
     * @return 是否启用重试
     */
    boolean retryEnabled() default true;
    
    /**
     * 最大重试次数
     * 
     * @return 最大重试次数
     */
    int maxRetries() default 3;
    
    /**
     * 是否启用keepalive
     * 
     * @return 是否启用keepalive
     */
    boolean keepAliveEnabled() default false;
    
    /**
     * keepalive时间间隔（秒）
     * 
     * @return keepalive时间间隔
     */
    long keepAliveTimeSeconds() default 30;
    
    /**
     * keepalive超时时间（秒）
     * 
     * @return keepalive超时时间
     */
    long keepAliveTimeoutSeconds() default 5;
    
    /**
     * 是否在没有活跃流时也发送keepalive
     * 
     * @return 是否在没有活跃流时也发送keepalive
     */
    boolean keepAliveWithoutCalls() default false;
} 